package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// gin入门
func main() {
	//创建gin Engine
	//Engine是对Web服务器的抽象
	//在一个项目中,可以创建多个Engine,每个Engine监听不同的端口
	//Engine承担了路由注册,绑定middleware等核心功能
	//Engine内部组合了RouterGroup,RouterGroup是实现路由功能的核心组件
	server := gin.Default()

	//gin.Context是Gin框架中的核心组件,表示当前请求的上下文
	//gin.Context内部组合了Request和ResponseWriter
	//gin.Context的核心职责就是处理请求和返回响应
	//gin.Context实现了请求数据在各个middleware之间的传递

	//路由注册
	//路由注册的核心就是两个元素:路由规则+处理函数
	//静态路由——这是使用最多的方式
	server.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "ok",
			"data":    "pong",
		})
	})

	//参数路由——Path Param路径参数
	server.POST("/user/:username", func(c *gin.Context) {
		//通过Context.Param方法,获取Path Param
		username := c.Param("username")
		c.String(http.StatusOK, "hello: %s", username)
	})

	//参数路由——Query请求参数
	server.PUT("/order", func(c *gin.Context) {
		orderId := c.Query("order_id")
		c.String(http.StatusOK, "orderId: %s", orderId)
	})

	//参数路由——批量绑定Query参数
	server.GET("/user", func(c *gin.Context) {
		//定义局部结构体,仅针对当前函数使用
		type QueryUserReq struct {
			UserId   string `form:"user_id" json:"user_id"` //通过form tag指定Query参数
			UserName string `form:"user_name" json:"user_name"`
			Gender   int    `form:"gender" json:"gender"`
			Address  string `form:"address" json:"address"`
		}
		var req QueryUserReq
		err := c.BindQuery(&req)
		if err != nil {
			c.AbortWithStatus(http.StatusBadRequest)
			return
		}

		c.JSON(http.StatusOK, req)
	})

	//通配符路由(很少使用)
	//使用*代表通配符
	//*不能单独出现
	server.GET("/view/*.html", func(c *gin.Context) {
		//通过Param()方法获取通配符
		//获取到的参数的完整内容,即: /xxx.html
		view := c.Param(".html")
		c.String(http.StatusOK, "view: %s", view)
	})

	//启动服务器,并监听指定端口
	server.Run(":8080")
}
